#include <REGX51.H>
#include <absacc.h>
#include <definicje.h>
#include <prototypy.h>


extern data   	byte pobrane;
extern data   	int  zapisane;
extern data		byte klucz[8];
extern data 	byte klucz2[8];
extern data    	byte bufor[16];
extern xdata	byte zaszyfrowane[2048];
extern bdata 	bit	 klucz_wczytany;
extern bdata   	bit  koniec_transmisji;



void deszyfruj(void)
{
	#define k pobrane
	byte i;
	int j=0;
	koniec_transmisji=0;
	
	if(!klucz_wczytany)
	{
		lcd_NowaLinia();
		lcd_WyczyscLinie();
		lcd_PiszTekst("  Brak klucza!  ");
		beep();
		czekaj(2);
		goto koniec_deszyfrowania;
	}
	
	//wlaczam przerwania z timera 0 i COM
	led_Off();
	przerwania_Off();
	timer_UstawDoCom();
	com_PrzygotujNadawanie();

	lcd_Wyczysc();
	lcd_PiszTekst("Podlacz terminali nacisnij ENTER");
	czekaj_na_klawisz(0x0F);
	lcd_Wyczysc();
	lcd_PiszTekst("Deszyfrowanie... ENTER - koniec ");
	timer_1_Start();
	//
	lcd_Wyczysc();
	//
	TI=1;
	j=0;
	while(!koniec_transmisji)
	{
		i=0;
		while(i!=16)
		{
			bufor[i]=zaszyfrowane[j];
			i++;
			j++;
		}
		deszyfruj_bufor();
		i=0;
		while(i!=16)
		{
			while(!TI);
			TI=0;
			com_Wyslij(bufor[i]);
			i++;
		}
		if(XBYTE[0xF022]>>7==0||j==zapisane)//jesli wcisniemy enter
		{
			koniec_transmisji=1;	
		}		
	}
	
	lcd_Wyczysc();
	lcd_PiszTekst("     KONIEC     Wcisnij ENTER...");
	beep();
	czekaj_na_klawisz(0x0F);
	koniec_deszyfrowania:
	;
	#undef k
}





























void deszyfruj_bufor(void)
{
	byte i=32, operacja;
	while(i!=0) //i jest numerem pary bitow w kluczu
	{
		
		i--;
		operacja=ZamienParyZwrocOperacje(i);
		switch(operacja)
		{
			case 0:
				alg_Bsr();
			break;
				
			case 1:
				alg_Bsl();
			break;
				
			case 2:
				alg_Xor();
			break;

			case 3:
				alg_Xnor();
			break;
		}
		ZamienParyZwrocOperacje(i);
	}			
}